package com.lord.otter.component.infrastructure.template.repository;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 获取数据的仓储
 *
 * @author lord
 * 2025/8/19 17:16
 */
public interface RepositoryQueryTemplate<T, ID> {

    /**
     * 根据主键获取数据
     *
     * @param id 主键
     * @author lord
     * 2025/8/19 17:16
     */
    default T get(ID id) {
        Set<ID> ids = new HashSet<>();
        ids.add(id);
        List<T> domains = this.get(ids);
        if (domains == null || domains.isEmpty()) {
            return null;
        }
        return domains.get(0);
    }

    /**
     * 根据主键获取数据
     *
     * @param ids 主键
     * @author lord
     * 2025/8/19 17:16
     */
    default List<T> get(Set<ID> ids){
        return databaseGet(ids);
    }


    /**
     * 从数据库获取数据
     *
     * @param ids 参数
     * @author lord
     * 2025/8/26 10:24
     */
    List<T> databaseGet(Set<ID> ids);


    /**
     * 根据主键获取map
     *
     * @param ids        主键
     * @param idFunction 主键获取方法
     * @author lord
     * 2025/8/19 17:16
     */
    default Map<ID, T> getMap(Set<ID> ids, Function<T, ID> idFunction) {
        List<T> domains = this.get(ids);
        if (domains == null || domains.isEmpty()) {
            return null;
        }
        return domains.stream().collect(Collectors.toMap(idFunction, Function.identity()));
    }

}
